import org.junit.Test;
import sun.rmi.runtime.Log;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;

/**
 *
 * @author: duanjq
 * @time: 2021/9/2 22:06
 */
public class TestLambda3 {

    List<Employee> employeeList= Arrays.asList(
            new Employee("张三",18,9999.99),
            new Employee("李四",38,5555.99),
            new Employee("王五",50,66666.66),
            new Employee("赵六",16,3333.33),
            new Employee("田七",8,7777.77)
    );


    /**
     *调用Conllections.sort()方法，通过定制排序比较两个Employee(先按照年龄比，年龄相同 按姓名比)，使用Lambda作为参数传递
     */
    @Test
    public void test1(){
        Collections.sort(employeeList,(x,y)->{
            if(x.getAge()==y.getAge()){
             return  x.getName().compareTo(y.getName());
            }else {
               return Integer.compare(x.getAge(),y.getAge());
            }
        });

        employeeList.forEach(System.out::println);
    }

    /**
     * (1)声明函数接口，接口中声明抽象方法,public String getValue(String str);
     * (2)声明类TestLambda,类中编写方法使用接口作为参数，将一个字符串转换为大写并作为方法的返回值
     * (3)再将一个字符串的第2个和第4个索引位置进行截取字符串。
     */
     @Test
    public  void  test2(){
        String str=strHandler("abcd",x->x.toUpperCase());
        System.out.println(str);

        String str2=strHandler("zhangsanlisi",x->x.substring(1,3));
        System.out.println(str2);
    }
    public String strHandler(String str,MyFunction myFunction){
        return myFunction.getValue(str);
    }

    /**
     * （1）声明也给带两个泛型的函数式接口，泛型类型为<T,R>T为参数,R为返回值
     * (2)接口中声明对应抽象方法
     * (3)在TestLambda类中声明方法，使用接口作为参数,计算两个long型参数的和
     * (4)再计两个long型参数的乘积
     */
    @Test
    public  void test3(){
       Long xx= opration(100L,200L,(x,y)->x*y);
       System.out.println(xx);
    }
    public Long opration(Long p1, Long p2, MyFunction2<Long,Long> myFunction2){

       return myFunction2.getValue(p1,p2);
    }
}
